home *** CD-ROM | disk | FTP | other *** search
-
-
-
- MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333)))) MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333))))
-
-
-
- NNNNAAAAMMMMEEEE
- Math::Complex - complex numbers and associated mathematical functions
-
- SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
- use Math::Complex;
-
- $z = Math::Complex->make(5, 6);
- $t = 4 - 3*i + $z;
- $j = cplxe(1, 2*pi/3);
-
-
- DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
- This package lets you create and manipulate complex numbers. By default,
- _P_e_r_l limits itself to real numbers, but an extra use statement brings
- full complex support, along with a full set of mathematical functions
- typically associated with and/or extended to complex numbers.
-
- If you wonder what complex numbers are, they were invented to be able to
- solve the following equation:
-
- x*x = -1
-
- and by definition, the solution is noted _i (engineers use _j instead since
- _i usually denotes an intensity, but the name does not matter). The number
- _i is a pure _i_m_a_g_i_n_a_r_y number.
-
- The arithmetics with pure imaginary numbers works just like you would
- expect it with real numbers... you just have to remember that
-
- i*i = -1
-
- so you have:
-
- 5i + 7i = i * (5 + 7) = 12i
- 4i - 3i = i * (4 - 3) = i
- 4i * 2i = -8
- 6i / 2i = 3
- 1 / i = -i
-
- Complex numbers are numbers that have both a real part and an imaginary
- part, and are usually noted:
-
- a + bi
-
- where a is the _r_e_a_l part and b is the _i_m_a_g_i_n_a_r_y part. The arithmetic with
- complex numbers is straightforward. You have to keep track of the real
- and the imaginary parts, but otherwise the rules used for real numbers
- just apply:
-
- (4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i
- (2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i
-
-
-
-
- PPPPaaaaggggeeee 1111
-
-
-
-
-
-
- MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333)))) MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333))))
-
-
-
- A graphical representation of complex numbers is possible in a plane
- (also called the _c_o_m_p_l_e_x _p_l_a_n_e, but it's really a 2D plane). The number
-
- z = a + bi
-
- is the point whose coordinates are (a, b). Actually, it would be the
- vector originating from (0, 0) to (a, b). It follows that the addition of
- two complex numbers is a vectorial addition.
-
- Since there is a bijection between a point in the 2D plane and a complex
- number (i.e. the mapping is unique and reciprocal), a complex number can
- also be uniquely identified with polar coordinates:
-
- [rho, theta]
-
- where rho is the distance to the origin, and theta the angle between the
- vector and the _x axis. There is a notation for this using the exponential
- form, which is:
-
- rho * exp(i * theta)
-
- where _i is the famous imaginary number introduced above. Conversion
- between this form and the cartesian form a + bi is immediate:
-
- a = rho * cos(theta)
- b = rho * sin(theta)
-
- which is also expressed by this formula:
-
- z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
-
- In other words, it's the projection of the vector onto the _x and _y axes.
- Mathematicians call _r_h_o the _n_o_r_m or _m_o_d_u_l_u_s and _t_h_e_t_a the _a_r_g_u_m_e_n_t of the
- complex number. The _n_o_r_m of z will be noted abs(z).
-
- The polar notation (also known as the trigonometric representation) is
- much more handy for performing multiplications and divisions of complex
- numbers, whilst the cartesian notation is better suited for additions and
- subtractions. Real numbers are on the _x axis, and therefore _t_h_e_t_a is zero
- or _p_i.
-
- All the common operations that can be performed on a real number have
- been defined to work on complex numbers as well, and are merely
- _e_x_t_e_n_s_i_o_n_s of the operations defined on real numbers. This means they
- keep their natural meaning when there is no imaginary part, provided the
- number is within their definition set.
-
- For instance, the sqrt routine which computes the square root of its
- argument is only defined for non-negative real numbers and yields a non-
- negative real number (it is an application from RRRR++++ to RRRR++++). If we allow
- it to return a complex number, then it can be extended to negative real
- numbers to become an application from RRRR to CCCC (the set of complex
-
-
-
- PPPPaaaaggggeeee 2222
-
-
-
-
-
-
- MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333)))) MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333))))
-
-
-
- numbers):
-
- sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
-
- It can also be extended to be an application from CCCC to CCCC, whilst its
- restriction to RRRR behaves as defined above by using the following
- definition:
-
- sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
-
- Indeed, a negative real number can be noted [x,pi] (the modulus _x is
- always non-negative, so [x,pi] is really -x, a negative number) and the
- above definition states that
-
- sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
-
- which is exactly what we had defined for negative real numbers above.
-
- All the common mathematical functions defined on real numbers that are
- extended to complex numbers share that same property of working _a_s _u_s_u_a_l
- when the imaginary part is zero (otherwise, it would not be called an
- extension, would it?).
-
- A _n_e_w operation possible on a complex number that is the identity for
- real numbers is called the _c_o_n_j_u_g_a_t_e, and is noted with an horizontal bar
- above the number, or ~z here.
-
- z = a + bi
- ~z = a - bi
-
- Simple... Now look:
-
- z * ~z = (a + bi) * (a - bi) = a*a + b*b
-
- We saw that the norm of z was noted abs(z) and was defined as the
- distance to the origin, also known as:
-
- rho = abs(z) = sqrt(a*a + b*b)
-
- so
-
- z * ~z = abs(z) ** 2
-
- If z is a pure real number (i.e. b == 0), then the above yields:
-
- a * a = abs(a) ** 2
-
- which is true (abs has the regular meaning for real number, i.e. stands
- for the absolute value). This example explains why the norm of z is noted
- abs(z): it extends the abs function to complex numbers, yet is the
- regular abs we know when the complex number actually has no imaginary
- part... This justifies _a _p_o_s_t_e_r_i_o_r_i our use of the abs notation for the
-
-
-
- PPPPaaaaggggeeee 3333
-
-
-
-
-
-
- MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333)))) MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333))))
-
-
-
- norm.
-
- OOOOPPPPEEEERRRRAAAATTTTIIIIOOOONNNNSSSS
- Given the following notations:
-
- z1 = a + bi = r1 * exp(i * t1)
- z2 = c + di = r2 * exp(i * t2)
- z = <any complex or real number>
-
- the following (overloaded) operations are supported on complex numbers:
-
- z1 + z2 = (a + c) + i(b + d)
- z1 - z2 = (a - c) + i(b - d)
- z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
- z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
- z1 ** z2 = exp(z2 * log z1)
- ~z1 = a - bi
- abs(z1) = r1 = sqrt(a*a + b*b)
- sqrt(z1) = sqrt(r1) * exp(i * t1/2)
- exp(z1) = exp(a) * exp(i * b)
- log(z1) = log(r1) + i*t1
- sin(z1) = 1/2i (exp(i * z1) - exp(-i * z1))
- cos(z1) = 1/2 (exp(i * z1) + exp(-i * z1))
- atan2(z1, z2) = atan(z1/z2)
-
- The following extra operations are supported on both real and complex
- numbers:
-
- Re(z) = a
- Im(z) = b
- arg(z) = t
-
- cbrt(z) = z ** (1/3)
- log10(z) = log(z) / log(10)
- logn(z, n) = log(z) / log(n)
-
- tan(z) = sin(z) / cos(z)
-
- csc(z) = 1 / sin(z)
- sec(z) = 1 / cos(z)
- cot(z) = 1 / tan(z)
-
- asin(z) = -i * log(i*z + sqrt(1-z*z))
- acos(z) = -i * log(z + i*sqrt(1-z*z))
- atan(z) = i/2 * log((i+z) / (i-z))
-
- acsc(z) = asin(1 / z)
- asec(z) = acos(1 / z)
- acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
-
-
-
-
-
-
- PPPPaaaaggggeeee 4444
-
-
-
-
-
-
- MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333)))) MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333))))
-
-
-
- sinh(z) = 1/2 (exp(z) - exp(-z))
- cosh(z) = 1/2 (exp(z) + exp(-z))
- tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z))
-
- csch(z) = 1 / sinh(z)
- sech(z) = 1 / cosh(z)
- coth(z) = 1 / tanh(z)
-
- asinh(z) = log(z + sqrt(z*z+1))
- acosh(z) = log(z + sqrt(z*z-1))
- atanh(z) = 1/2 * log((1+z) / (1-z))
-
- acsch(z) = asinh(1 / z)
- asech(z) = acosh(1 / z)
- acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1))
-
- _l_o_g, _c_s_c, _c_o_t, _a_c_s_c, _a_c_o_t, _c_s_c_h, _c_o_t_h, _a_c_o_s_e_c_h, _a_c_o_t_a_n_h, have aliases _l_n,
- _c_o_s_e_c, _c_o_t_a_n, _a_c_o_s_e_c, _a_c_o_t_a_n, _c_o_s_e_c_h, _c_o_t_a_n_h, _a_c_o_s_e_c_h, _a_c_o_t_a_n_h,
- respectively.
-
- The _r_o_o_t function is available to compute all the _n roots of some
- complex, where _n is a strictly positive integer. There are exactly _n
- such roots, returned as a list. Getting the number mathematicians call j
- such that:
-
- 1 + j + j*j = 0;
-
- is a simple matter of writing:
-
- $j = ((root(1, 3))[1];
-
- The _kth root for z = [r,t] is given by:
-
- (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
-
- The _s_p_a_c_e_s_h_i_p comparison operator, <=>, is also defined. In order to
- ensure its restriction to real numbers is conform to what you would
- expect, the comparison is run on the real part of the complex number
- first, and imaginary parts are compared only when the real parts match.
-
- CCCCRRRREEEEAAAATTTTIIIIOOOONNNN
- To create a complex number, use either:
-
- $z = Math::Complex->make(3, 4);
- $z = cplx(3, 4);
-
- if you know the cartesian form of the number, or
-
- $z = 3 + 4*i;
-
- if you like. To create a number using the polar form, use either:
-
-
-
-
- PPPPaaaaggggeeee 5555
-
-
-
-
-
-
- MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333)))) MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333))))
-
-
-
- $z = Math::Complex->emake(5, pi/3);
- $x = cplxe(5, pi/3);
-
- instead. The first argument is the modulus, the second is the angle (in
- radians, the full circle is 2*pi). (Mnemonic: e is used as a notation
- for complex numbers in the polar form).
-
- It is possible to write:
-
- $x = cplxe(-3, pi/4);
-
- but that will be silently converted into [3,-3pi/4], since the modulus
- must be non-negative (it represents the distance to the origin in the
- complex plane).
-
- SSSSTTTTRRRRIIIINNNNGGGGIIIIFFFFIIIICCCCAAAATTTTIIIIOOOONNNN
- When printed, a complex number is usually shown under its cartesian form
- _a+_b_i, but there are legitimate cases where the polar format [_r,_t] is more
- appropriate.
-
- By calling the routine Math::Complex::display_format and supplying either
- "polar" or "cartesian", you override the default display format, which is
- "cartesian". Not supplying any argument returns the current setting.
-
- This default can be overridden on a per-number basis by calling the
- display_format method instead. As before, not supplying any argument
- returns the current display format for this number. Otherwise whatever
- you specify will be the new display format for _t_h_i_s particular number.
-
- For instance:
-
- use Math::Complex;
-
- Math::Complex::display_format('polar');
- $j = ((root(1, 3))[1];
- print "j = $j\n"; # Prints "j = [1,2pi/3]
- $j->display_format('cartesian');
- print "j = $j\n"; # Prints "j = -0.5+0.866025403784439i"
-
- The polar format attempts to emphasize arguments like _k*_p_i/_n (where _n is
- a positive integer and _k an integer within [-9,+9]).
-
- UUUUSSSSAAAAGGGGEEEE
- Thanks to overloading, the handling of arithmetics with complex numbers
- is simple and almost transparent.
-
- Here are some examples:
-
- use Math::Complex;
-
-
-
-
-
-
- PPPPaaaaggggeeee 6666
-
-
-
-
-
-
- MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333)))) MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333))))
-
-
-
- $j = cplxe(1, 2*pi/3); # $j ** 3 == 1
- print "j = $j, j**3 = ", $j ** 3, "\n";
- print "1 + j + j**2 = ", 1 + $j + $j**2, "\n";
-
- $z = -16 + 0*i; # Force it to be a complex
- print "sqrt($z) = ", sqrt($z), "\n";
-
- $k = exp(i * 2*pi/3);
- print "$j - $k = ", $j - $k, "\n";
-
-
- EEEERRRRRRRROOOORRRRSSSS DDDDUUUUEEEE TTTTOOOO DDDDIIIIVVVVIIIISSSSIIIIOOOONNNN BBBBYYYY ZZZZEEEERRRROOOO
- The division (/) and the following functions
-
- tan
- sec
- csc
- cot
- asec
- acsc
- atan
- acot
- tanh
- sech
- csch
- coth
- atanh
- asech
- acsch
- acoth
-
- cannot be computed for all arguments because that would mean dividing by
- zero or taking logarithm of zero. These situations cause fatal runtime
- errors looking like this
-
- cot(0): Division by zero.
- (Because in the definition of cot(0), the divisor sin(0) is 0)
- Died at ...
-
- or
-
- atanh(-1): Logarithm of zero.
- Died at...
-
- For the csc, cot, asec, acsc, acot, csch, coth, asech, acsch, the
- argument cannot be 0 (zero). For the atanh, acoth, the argument cannot
- be 1 (one). For the atanh, acoth, the argument cannot be -1 (minus one).
- For the atan, acot, the argument cannot be i (the imaginary unit). For
- the atan, acoth, the argument cannot be -i (the negative imaginary unit).
- For the tan, sec, tanh, sech, the argument cannot be _p_i/_2 + _k * _p_i, where
- _k is any integer.
-
-
-
-
- PPPPaaaaggggeeee 7777
-
-
-
-
-
-
- MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333)))) MMMMaaaatttthhhh::::::::CCCCoooommmmpppplllleeeexxxx((((3333))))
-
-
-
- BBBBUUUUGGGGSSSS
- Saying use Math::Complex; exports many mathematical routines in the
- caller environment and even overrides some (sqrt, log). This is
- construed as a feature by the Authors, actually... ;-)
-
- All routines expect to be given real or complex numbers. Don't attempt to
- use BigFloat, since Perl has currently no rule to disambiguate a '+'
- operation (for instance) between two overloaded entities.
-
- AAAAUUUUTTTTHHHHOOOORRRRSSSS
- Raphael Manfredi <_R_a_p_h_a_e_l__M_a_n_f_r_e_d_i@_g_r_e_n_o_b_l_e._h_p._c_o_m> and Jarkko Hietaniemi
- <_j_h_i@_i_k_i._f_i>.
-
- Extensive patches by Daniel S. Lewart <_d-_l_e_w_a_r_t@_u_i_u_c._e_d_u>.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PPPPaaaaggggeeee 8888
-
-
-
-